格雷码

题目 格雷码

image-e0e4225d

思路分析

奇数次时 改变末尾数字

偶数次时 找到最右边一个1 改变其左侧数字

显然这是要补充第二种情况的实现逻辑

找到最右边的一个1 lowbit x&-x即可 要把左边那个数改变 应该是生成一个 形如00100的掩码 1的位置应该是lowbit找到的1的位置的左边 即 (x&-x)<<1

a = a^((a&-a )<<1)

代码实现

#include <stdio.h>

void show(int a,int n)

{

    int i;

    int msk = 1;

    for(i=0; i<n-1; i++) msk = msk << 1;

    for(i=0; i<n; i++){

        printf((a & msk)? "1" : "0");

        msk = msk >> 1;

    }

    printf("\n");

}

void f(int n)

{

    int i;

    int num = 1;

    for(i=0; i<n; i++) num = num<<1;

    int a = 0;

    for(i=0; i<num; i++){

        show(a,n);

        if(i%2==0){

            a = a ^ 1;

        }

        else{

            a = a^((a&-a)<<1); //填空

        }

    }

}

int main()

{

    int a;

    scanf("%d",&a);

    f(a);

    return 0;

}

同类题型

视频讲解


⬅️ 激光样式 🏠 00-冲刺国赛 ➡️ 调手表